package edu.corn.job.core.processor;


import edu.corn.job.core.context.JobRunningContext;
import edu.corn.job.core.engine.JobEngine;
import edu.corn.job.core.processor.adapter.handler.ExceptionHandler;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.util.LinkedHashMap;

/**
 * 抽象job类。
 * 在这个类中存储更多和job相关的信息，不只是组合或者是phase的。
 * 承接更多的职责：
 * 1.互斥量
 * 2.
 */
@Data
public abstract class AbstractJobProcessor implements IProcessor, MutexProcessor, Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    protected AbstractJobProcessor() {
    }

    /**
     * 返回执行引擎。
     */
    protected JobEngine engine;

    /**
     * 注册异常处理器。
     * 根据
     */
    protected LinkedHashMap<Class<? extends Throwable>, ExceptionHandler> exceptionHandlers;

    // 添加异常处理器
    protected void addHandler(Class<? extends Throwable> exceptionClass, ExceptionHandler handler) {
        exceptionHandlers.put(exceptionClass, handler);
    }

    // 处理异常
    public boolean handleException(Throwable throwable, JobRunningContext context) {
        for (var entry : exceptionHandlers.entrySet()) {
            if (entry.getKey().isInstance(throwable)) {
                if (entry.getValue().handle(throwable, context)){
                    context.setThrowable(null);
                    return true;
                }

            }
        }
        return false; // 默认返回值，如果没有匹配的处理器
    }


    @Override
    public JobEngine getEngine() {
        return engine;
    }

}
